# 使用内置模块collections中的defaultdict(func)，能够将哈希表的值value的默认类型设置为func。
# 譬如要设置哈希表中value的默认类型为list，其语法如下：
from collections import defaultdict
dic = defaultdict(list)

# dic[0]此时即为一个空列表，可以使用所有的列表操作
dic[0].append(1)
dic[0].extend([2, 3])
# - 如果设置了value的默认类型为list，那么访问key对应的value默认得到一个空列表[]
# - 如果设置了value的默认类型为int，那么访问key对应的value默认得到数字0
# - 如果设置了value的默认类型为str，那么访问key对应的value默认得到空字符串""
# 除了设置默认类型，defaultdict()还可以结合lambda匿名函数，设置更加丰富的默认值。
# 譬如想设置value的默认值为1，其语法如下：
from collections import defaultdict
dic = defaultdict(lambda: 1)
print(dic[0])    # 会输出1

dic = defaultdict(lambda: "aabbcc")
print(dic[0])    # 会输出"aabbcc"

# 在内置模块collections中引入Counter()，可以直接统计字符串、列表等可迭代对象的元素频率。
from collections import Counter

lst = [1, 1, 2, 3, 3]
cnt = Counter(lst)

#哈希表的keys()，values()以及items()方法分别可以获得键、值或者键值对的一个可迭代对象。
dic = {0: 1, 2: 3, 4: 5}

# 遍历key方法1
# 分行输出：0 2 4
for k in dic:
    print(k)

# 遍历key方法2
# 分行输出：0 2 4
for k in dic.keys():
    print(k)

# 获得哈希表中所有键key组成的一个列表
# keys = [0, 2, 4]
keys = list(dic.keys())

# 遍历values
# 分行输出：1 3 5
for v in dic.values():
    print(v)

# 获得哈希表中所有值value组成的一个列表
# values = [1, 3, 5]
values = list(dic.values())

# 遍历key和values
# 分行输出：0 1    2 3    4 5
for k, v in dic.items():
    print(k, v)

# 获得哈希表中所有键值对(key, value)组成的一个二元列表
# pairs = [(0, 1), (2, 3), (4, 5)]
pairs = list(dic.items())